import axios from 'axios'

// 创建axios实例
const http = axios.create({
  baseURL: 'http://localhost:8080',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
http.interceptors.request.use(
  config => {
    console.log('发送预约看房请求:', config)
    // 这里可以添加token验证
    const token = localStorage.getItem('token')
    //test
    console.log("token=============>",token)

    if (token) {
      config.headers.Authorization = `${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
http.interceptors.response.use(
  response => {
    console.log('预约看房响应数据:', response)
    return response.data
  },
  error => {
    console.error('预约看房请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * 预约看房
 * @param {import('@/types/booking').IBookInfo} bookInfo - 预约信息
 * @returns {Promise<{id: string, success: boolean, message: string}>}
 */
export const bookRentRoomApi = async(bookInfo) => {
  try {
    // 发送 POST 请求到后端
    const response = await http.post('/auth/house/reservation', bookInfo)
    // 返回后端响应的data字段
    return response.data
  } catch (error) {
    console.error('预约看房失败:', error)
    
    // 可以根据错误类型返回不同的错误信息
    if (error.response) {
      // 服务器返回了错误状态码
      throw new Error(error.response.data.message || '预约失败')
    } else {
      // 网络错误或其他错误
      throw new Error('网络错误，请检查连接')
    }
  }
}

/**
 * 格式化时间显示
 * @param {string} dateString - ISO时间字符串
 * @returns {string} 格式化后的时间字符串
 */
const formatDateTime = (dateString) => {
  if (!dateString) return '未知时间'
  
  try {
    const date = new Date(dateString)
    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')
    
    return `${year}-${month}-${day} 全天 间时有空`
  } catch (error) {
    return '时间格式错误'
  }
}

/**
 * 将后端预约数据格式转换为前端期望的格式
 * @param {Object} backendData - 后端返回的预约数据
 * @returns {Object} 前端期望的预约数据格式
 */
const transformBookingData = (backendData) => {
  return {
    id: backendData.id,
    date: backendData.date,
    houseId: backendData.houseId,
    img: backendData.housePicture || '/src/assets/imgs/room_text_bg.png',
    title: backendData.houseTitle || '房源标题',
    subTitle: backendData.address || '房源地址',
    distanceInfo: backendData.distanceInfo || null,
    rentPrice: backendData.rentPriceListing || '0',
    tags: backendData.tags || [],
    comment: backendData.comment || '无备注',
    status: backendData.status || '待看房',
    createTime: formatDateTime(backendData.createdAt || backendData.date)
  }
}

/**
 * 获取预约租房列表
 * @returns {Promise<import('@/types/booking').IBookRentRoomList>}
 */
export const getBookRentRoomListApi = async () => {
  try {
    const response = await http.get('/auth/house/history')
    const backendData = response.data || []
    
    // 将后端数据格式转换为前端期望的格式
    const transformedData = Array.isArray(backendData) 
      ? backendData.map(transformBookingData)
      : []
    
    console.log('后端原始数据:', backendData)
    console.log('转换后数据:', transformedData)
    
    return transformedData
  } catch (error) {
    console.error('获取预约看房列表失败:', error)
    
    if (error.response) {
      // 服务器返回了错误状态码
      throw new Error(error.response.data.message || '获取预约列表失败')
    } else {
      // 网络错误或其他错误
      throw new Error('网络错误，请检查连接')
    }
  }
}

/**
 * 取消预约
 * @param {string} bookingId - 预约ID
 * @returns {Promise<{code: number, message: string}>}
 */
export const cancelBookingApi = async (bookingId) => {
  try {
    const response = await http.delete(`/auth/house/reservation?id=${bookingId}`)
    // 返回后端响应
    return response
  } catch (error) {
    console.error('取消预约失败:', error)
    
    if (error.response) {
      // 服务器返回了错误状态码
      throw new Error(error.response.data.message || '取消预约失败')
    } else {
      // 网络错误或其他错误
      throw new Error('网络错误，请检查连接')
    }
  }
}

/**
 * 获取预约统计信息
 * @returns {Promise<import('@/types/booking').IBookingStats>}
 */
export const getBookingStatsApi = async () => {
  try {
    const response = await http.get('/auth/house/reservation/stats')
    // 返回后端响应的data字段
    return response.data
  } catch (error) {
    console.error('获取预约统计失败:', error)
    
    if (error.response) {
      // 服务器返回了错误状态码
      throw new Error(error.response.data.message || '获取统计信息失败')
    } else {
      // 网络错误或其他错误
      throw new Error('网络错误，请检查连接')
    }
  }
}

export default http
